package com.yn.iotxiao.Utils;

import io.micrometer.common.util.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class DateUtil {
    /** 分 */
    public static final long MINUTE_TTL = 60 * 1000L;
    /** 时 */
    public static final long HOURS_TTL = 60 * 60 * 1000L;
    /** 半天 */
    public static final long HALF_DAY_TTL = 12 * 60 * 60 * 1000L;
    /** 天 */
    public static final long DAY_TTL = 24 * 60 * 60 * 1000L;
    /** 月 */
    public static final long MONTH_TTL = 30 * 24 * 60 * 60 * 1000L;
    /** 时间格式(yyyy-MM-dd) */
    public final static String DATE_PATTERN = "yyyy-MM-dd";
    /** 时间格式(yyyy-MM-dd'T'HH:mm:ss.SSSZ) */
    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ssZ";

    private static ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal = new ThreadLocal<SimpleDateFormat>() {
        @Override
        protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat(DATE_TIME_PATTERN);
        }
    };

    public static Long getSystemTimeSeconds() {
        return System.currentTimeMillis() / 1000L;
    }

    /**
     * @Description:   将时间戳转换为时间
     * 输入形如：148851067484755 输出形如：2017-03-03T11:11:14.000+0800
     * 异常格式返回-1
     * @param s
     * @return
     */
    public static String getTimestampDateTimeLong(Long s) {
        String res;
        Date date = new Date(s * 1000);
        res = simpleDateFormatThreadLocal.get().format(date);
        return res;
    }

    /**
     *
     * @Description: 将时间戳转换为时间
     * @param s 毫秒数
     * @return
     */
    public static String getTimestampDateLong(Long s) {
        return simpleDateFormatThreadLocal.get().format(new Date(s));
    }

    /**
     *
     * @Description: 日期格式化 日期格式为：yyyy-MM-dd
     * @param date  日期
     * @return 返回yyyy-MM-dd格式日期
     */
    public static String formatShort(Date date) {
        return format(date, DATE_PATTERN);
    }


    /**
     *
     * @Description: 日期格式化 日期格式为：yyyy-MM-dd'T'HH:mm:ss.SSSZ
     * @param date 日期
     * @return 返回
     */
    public static String formatLong(Date date) {
        return format(date, DATE_TIME_PATTERN);
    }

    /**
     *
     * @Description: 格式化时间
     * @param date
     * @param pattern
     * @return
     */
    public static String format(Date date, String pattern) {
        if (date != null) {
            SimpleDateFormat df = null;
            if (DATE_TIME_PATTERN.equals(pattern)) {
                df = simpleDateFormatThreadLocal.get();
            } else {
                df = new SimpleDateFormat(pattern);
            }
            return df.format(date);
        }
        return null;
    }

    /**
     *
     * @Description: 字符串转时间
     * @param strDate
     * @return
     * @throws ParseException
     */
    public static Date stringLongToDate(String strDate) throws ParseException {
        return stringToDate(strDate, DATE_TIME_PATTERN);
    }

    public static Date stringShortToDate(String strDate) throws ParseException {
        return stringToDate(strDate, DATE_PATTERN);
    }

    /**
     * 字符串转换成日期
     * @param strDate 日期字符串
     * @param pattern 日期的格式
     * @throws ParseException
     */
    public static Date stringToDate(String strDate, String pattern) throws ParseException {
        if (StringUtils.isBlank(strDate)) {
            return null;
        }
        SimpleDateFormat df = null;
        if (DATE_TIME_PATTERN.equals(pattern)) {
            df = simpleDateFormatThreadLocal.get();
        } else {
            df = new SimpleDateFormat(pattern);
        }
        return df.parse(strDate);
    }

    /**
     * @Description: 日期计算
     * @param oldDate
     * @param addValue
     * @param unit
     * @return
     */
    public static Date add(Date oldDate, Long addValue, TimeUnit unit) {
        long milliseconds = oldDate.getTime();
        milliseconds += unit.toMillis(addValue);
        return new Date(milliseconds);
    }
}
